// HJ27.查找兄弟单词
// https://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68
//定义一个单词的“兄弟单词”为：交换该单词字母顺序（注：可以交换任意次），而不添加、删除、修改原有的字母就能生成的单词。
//兄弟单词要求和原来的单词不同。例如： ab 和 ba 是兄弟单词。 ab 和 ab
//则不是兄弟单词。 现在给定你 n 个单词，另外再给你一个单词 x ，让你寻找 x
//的兄弟单词里，按字典序排列后的第 k 个单词是什么？ 注意：字典中可能有重复单词。
//输入：6 cab ad abcd cba abc bca abc 1
//输出：3
// bca
// abc的兄弟单词有cab cba bca，所以输出3
//经字典序排列后，变为bca cab cba，所以第1个字典序兄弟单词为bca

#include <algorithm>
#include <iostream>
#include <set>
#include <string>
#include <vector>
using namespace std;

void printVect(const vector<string>& vec) {
  for (auto v : vec) {
    printf("%s.", v.c_str());
  }
  printf("\n");
}

vector<string> brotherWord(vector<string>& vtWord, string myWord) {
  vector<string> res;
  string mySortWd = myWord;
  std::sort(mySortWd.begin(), mySortWd.end());
  for (int i = 0; i < vtWord.size(); i++) {
    if (vtWord[i] != myWord) {
      string sTmp = vtWord[i];
      std::sort(sTmp.begin(), sTmp.end());
      if (sTmp == mySortWd) {
        res.push_back(vtWord[i]);
      }
    }
  }
  std::sort(res.begin(), res.end());
  return res;
}

int main_hj27() {
  int num = 6;
  //  cin >> num;
  vector<string> vtWord(num);
  string myWord;
  for (int i = 0; i < num; i++) {
    //    cin >> vtWord[i];
  }
  //  cin >> myWord;
  int k = 1;
  //  cin >> k;  // 查找到的按照字典顺序

  //  6 cab ad abcd cba abc bca abc 1
  int i = 0;
  vtWord[i++] = "cab";
  vtWord[i++] = "ad";
  vtWord[i++] = "abcd";
  vtWord[i++] = "cba";
  vtWord[i++] = "abc";
  vtWord[i++] = "bca";
  myWord = "abc";
  vector<string> out = brotherWord(vtWord, myWord);
  printVect(out);
  printf("%d\n", out.size());
  printf("%s\n", out[k - 1].c_str());

  return 0;
}
